﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using grupo2DEWStudio7i.Dominio;
using grupo2DEWStudio7i.Persistencia;
using NUnit.Framework;
using System.Data.SqlClient;

namespace grupo2DEWStudio7i.Persistencia.ADO
{
    public class ReservaDAO : IReservaDAO
    {
        IClienteDAO clienteDAO = new ClienteDAO();
        ISalaDAO salaDAO = new SalaDAO();
        //IServicioDAO servicioDAO = new ServicioDAO();
        //IInstrumentoDAO instrumentoDAO = new InstrumentoDAO();
        public Reserva Crear(Reserva reservaACrear)
        {
            string _Sentencia = @"INSERT INTO reserva (codigo, cliente, sala, dia, hora, costototal, nHoras) 
                VALUES(@codigo, @cliente, @sala, @dia, @hora, @costototal, @nHoras)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@cliente", reservaACrear.Cliente.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@sala", reservaACrear.Sala.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@dia", reservaACrear.Dia));
                    _Comando.Parameters.Add(new SqlParameter("@hora", reservaACrear.Hora));
                    _Comando.Parameters.Add(new SqlParameter("@nHoras", reservaACrear.Numero));
                    _Comando.Parameters.Add(new SqlParameter("@costototal", reservaACrear.CostoTotal));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        public Reserva Obtener(int codigo)
        {
            string _Sentencia = @"SELECT codigo, cliente, sala, dia, hora, costototal, nHoras
                FROM reserva WHERE codigo=@codigo";
            Reserva reservaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            reservaCreada = new Reserva();
                            reservaCreada.Codigo = (int)_Resultado["codigo"];
                            reservaCreada.Cliente = clienteDAO.Obtener((int)_Resultado["cliente"]);
                            reservaCreada.Sala = salaDAO.Obtener((int)_Resultado["sala"]);
                            reservaCreada.Dia = (string)_Resultado["dia"];
                            reservaCreada.Hora = (string)_Resultado["hora"];
                            reservaCreada.Numero = (int)_Resultado["nHoras"];
                            reservaCreada.CostoTotal = (decimal)_Resultado["costototal"];
                        }
                    }
                }
            }
            return reservaCreada;
        }

        public Reserva Modificar(Reserva entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Reserva reservaAEliminar)
        {
            string _Sentencia = "DELETE FROM reserva WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaAEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        public ICollection<Reserva> ListarTodos()
        {
            string _Sentencia = @"SELECT codigo, cliente, sala, dia, hora, costototal, nHoras FROM reserva";
            ICollection<Reserva> reservassEncontradas = new List<Reserva>();
            Reserva reservaaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            reservaaEncontrada = new Reserva();
                            reservaaEncontrada.Codigo = (int)_Resultado["codigo"];
                            reservaaEncontrada.Cliente = clienteDAO.Obtener((int)_Resultado["cliente"]);
                            reservaaEncontrada.Sala = salaDAO.Obtener((int)_Resultado["sala"]);
                            reservaaEncontrada.Dia = (string)_Resultado["dia"];
                            reservaaEncontrada.Hora = (string)_Resultado["hora"];
                            reservaaEncontrada.Numero = (int)_Resultado["nhoras"];
                            reservaaEncontrada.CostoTotal = (decimal)_Resultado["costototal"];
                            reservassEncontradas.Add(reservaaEncontrada);
                        }
                    }
                }
            }
            return reservassEncontradas;
        }

        public ICollection<Reserva> ListarXSala(int codigoSala)
        {
            string _Sentencia = @"SELECT codigo, cliente, sala, dia, hora, costototal, nHoras FROM reserva WHERE sala = @sala";
            ICollection<Reserva> reservassEncontradas = new List<Reserva>();
            Reserva reservaaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@sala", codigoSala));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            reservaaEncontrada = new Reserva();
                            reservaaEncontrada.Codigo = (int)_Resultado["codigo"];
                            reservaaEncontrada.Cliente = clienteDAO.Obtener((int)_Resultado["cliente"]);
                            reservaaEncontrada.Sala = salaDAO.Obtener((int)_Resultado["sala"]);
                            reservaaEncontrada.Dia = (string)_Resultado["dia"];
                            reservaaEncontrada.Hora = (string)_Resultado["hora"];
                            reservaaEncontrada.Numero = (int)_Resultado["nhoras"];
                            reservaaEncontrada.CostoTotal = (decimal)_Resultado["costototal"];
                            reservassEncontradas.Add(reservaaEncontrada);
                        }
                    }
                }
            }
            return reservassEncontradas;
        }


        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(codigo) FROM reserva";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}